import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JFrame implements ActionListener, KeyListener, MouseListener, MouseMotionListener
	{
		private static final long			serialVersionUID	= 1L;
		public static Map							map								= new Map();							//kartan
		public static ArrayList<Ship>	ships							= new ArrayList<Ship>();	//listan med alla skepp
		int														windowSize				= 750;										//fönsterstorlek
		static int										mouseX						= 0, mouseY = 0;
		final static double						userProcent				= 0.5;										///WTF? //hmm, antar att det har med svårighetsgraden att göra//nope, hur stor procent av planetets skep åker ivägg
		public final int							width							= 1300, height = windowSize;	//man kunde antagligen göra det snyggare:(
		Timer													t									= new Timer(50, this);				//timer, ska hända nya saker var 50 ms
																																									
		public JPanel									panel							= new JPanel()
																											{
																												private static final long	serialVersionUID	= 1L;
																												
																												public void paintComponent(Graphics g)
																													{
																														//rita ut bakgrundet
																														g.setColor(Color.GREEN);
																														g.fillRect(0, 0, width, height);
																														//rita ut kartan
																														map.drawMap(g, width, height);
																														//updatera muskoordinater
																														g.drawString("X= " + mouseX, 10, 10);
																														g.drawString("Y= " + mouseY, 10, 20);
																														//visa vilka som är markerade
																														map.showSelection(g);
																														
																														//flytta skepp
																														for (int i = 0; i < ships.size(); i++)
																															{
																																Ship s = ships.get(i);
																																Point drawtPoint = new Point(
																																		(int) (s.getStartPosition().x + (s.getCountPassedMowement() * s.getStegLx())),
																																		(int) (s.getStartPosition().y + (s.getCountPassedMowement() * s.getStegLy())));
																																g.fillRect((int) drawtPoint.getX(), (int) drawtPoint.getY(), 5, 5);
																																ships.get(i).updateCountPassedMowement();
																																//System.out.println(ships.get(0).getStegLx());
																															}
																														
																														//testutritning av gränser för alla planet
																														for (int i = 0; i < map.getPlanets().size(); i++)
																															{
																																for (int j = 0; j < map.getPlanets().get(i).getPointsOnFrame().size(); j++)
																																	{
																																		g.drawLine(map.getPlanets().get(i).getPointsOnFrame().get(j).x, map.getPlanets()
																																				.get(i).getPointsOnFrame().get(j).y, map.getPlanets().get(i)
																																				.getPointsOnFrame().get(j).x,
																																				map.getPlanets().get(i).getPointsOnFrame().get(j).y);
																																	}
																															}
																														
																													}
																											};
		
		public Main()
			{
				setSize(width, height);
				setLayout(new GridLayout(1, 1));//behövs???????
				setVisible(true);
				addKeyListener(this);
				setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//TODO: ändra till nåt bättre
				addKeyListener(this);//så det är JFrame som har keylistner med JPanel som lysnar på musen
				panel.addMouseListener(this);
				panel.addMouseMotionListener(this);
				add(panel);
				t.start();
				
				//vi börjar med att göra en ny karta med planeter
				map.generateNewMap(width, height, this);
			}
		
		public static void main(String[] args)
			{
				@SuppressWarnings("unused")
				Main m = new Main();
			}
		
		public static void sendShips(int targetPlanetNummer)
			{
				ArrayList<Planet> planets = map.getPlanets();
				if (map.getLastSelectedPlanet() == 404)
					return;
				for (int index = 0; index < planets.size(); index++)
					{
						if (planets.get(index).isSelected())
							{
								for (int i = 0; i < (int) (planets.get(index).getAntalPlan() * userProcent); i++)
									{
										int startx = planets.get(index).getPosition().x + (int) ((Math.random() * 50));
										int starty = planets.get(index).getPosition().y + (int) ((Math.random() * 50));
										int x = planets.get(targetPlanetNummer).getPosition().x - startx;//skepest Xmål från 0,0
										int y = planets.get(targetPlanetNummer).getPosition().y - starty;//Ymål
										double hypotenusan = Math.hypot(x, y);//länged längs med vilken skepet ska åka
										double antalSteg = hypotenusan / 5.0;
										double stagx = x / antalSteg;
										double stagy = y / antalSteg;
										//										System.out.println("Stagx: " + stagx
										//												+ "stagy: " + stagy);
										ships.add(new Ship(startx, starty, targetPlanetNummer, planets.get(index).getPlanetColor(), stagx, stagy));
										//System.out.println(i);
									}
								
							}
						
					}
			}
		
		public void actionPerformed(ActionEvent e)
			{
				repaint();
			}
		
		public void keyPressed(KeyEvent e)
			{
				//fråga inte varför det behövvs????
				if (e.getKeyCode() == KeyEvent.VK_S)
					{
						System.out.println("KeyPressed " + e.getKeyCode());
						if (map.isLoading())
							{
								System.out.println("fel");
							}
						else
							map.generateNewMap(height, height, this);
						
					}
			}
		
		//returnerar id av den klickade planeten
		public int getSelectedPlanetID(Point p, ArrayList<Planet> planets)
			{
				int x = (int) p.getX();
				int y = (int) p.getY();
				//loopar genom alla planeter:
				for(int i =0; i< planets.size();i++)
					{
						int side = planets.get(i).getSide();
						if(side!=60)
							{
								System.out.println("allert");
							}
						Rectangle r = new Rectangle(planets.get(i).getPosition().x-(side/2), planets.get(i).getPosition().y-(side/2), planets.get(i).getSide(), planets.get(i).getSide());
						if(r.contains(p))
							{
								System.out.println("finns: "+i);
								return(i);
							}
					}
//				for (int i = 0; i < planets.size(); i++)
//					{
//						//lopar genom alla ramPunkter på planeten
//						for (int j = 0; j < planets.get(i).getPointsOnFrame().size(); j++)
//							{
//								//anta att musen klickade på ramen:
//								if (x == planets.get(i).getPointsOnFrame().get(j).x && y == planets.get(i).getPointsOnFrame().get(j).y)
//									{
//										return (i);
//									}
//								//gå upp till toppen av planeten med muspunkten
//								for (int k = 0; k < planets.get(i).getSide(); k++)
//									{
//										if (x - k == planets.get(i).getPointsOnFrame().get(j).x)
//											{
//												//om man lycks träffa en ram en planet-sida ifron musens klickpunkt
//												//kolla om en ram finns på andra sidan
//												for (int l = 0; l < planets.get(i).getPointsOnFrame().size(); l++)
//													{
//														if (x - k + planets.get(i).getSide() == planets.get(i).getPointsOnFrame().get(l).x)
//															{
//																//om en ram finns returnera planetnummer
//																return (i);
//															}
//													}
//											}
//									}
								////(********
//								if (x == planets.get(i).getPointsOnFrame().get(j).x)
//									{
//										if (y == planets.get(i).getPointsOnFrame().get(j).y)
//											{
//												return (i);
//											}
//										for (int l = 0; l < planets.get(i).getPointsOnFrame().size(); l++)
//											{
//												if (x + (planets.get(i).getSide() - j) == planets.get(i).getPointsOnFrame().get(l).x)
//													{
//														return (i);
//													}
//											}
//									}
//							}
						
						//						for (int j = 0; j < planets.get(i).getPointsOnFrame().size(); j++)
						//							{
						//								if (planets.get(i).getPointsOnFrame().get(j).x == x && planets.get(i).getPointsOnFrame().get(j).y == y)
						//									{
						//										return (i);
						//										
						//									}
						//							}
//					}
				return (404);//default planet not found
			}
		
		//		public static int MousePositionX()
		//			{
		//				return mouseX;
		//			}
		//		public static int MousePositionY()
		//			{
		//				return mouseY;
		//			}
		public void keyReleased(KeyEvent e)
			{
			}
		
		public void keyTyped(KeyEvent e)
			{
			}
		
		public void mouseClicked(MouseEvent e)
			{
				//System.out.println(e.paramString());
				if (e.getButton() == 1)
					{
						int selectedPlanet = getSelectedPlanetID(e.getPoint(), map.getPlanets());
						if (selectedPlanet == 404 || map.getPlanets().get(selectedPlanet).getPlanetColor() != Color.BLUE)
							{
								for (int i = 0; i < map.getPlanets().size(); i++)
									{
										map.getPlanets().get(i).unSelect();
									}
							}
						else
							{
								
								map.getPlanets().get(selectedPlanet).select();
								map.setLastSelectedPlanet(selectedPlanet);
							}
					}
				else
					{
						int selectedPlanet = getSelectedPlanetID(e.getPoint(), map.getPlanets());
						if (selectedPlanet != 404)
							{
								sendShips(selectedPlanet);
							}
					}
			}
		
		public void mouseEntered(MouseEvent e)
			{
			}
		
		public void mouseExited(MouseEvent e)
			{
			}
		
		public void mousePressed(MouseEvent e)
			{
			}
		
		public void mouseReleased(MouseEvent e)
			{
			}
		
		public void mouseDragged(MouseEvent e)
			{
			}
		
		public void mouseMoved(MouseEvent e)
			{
				mouseX = e.getX();
				mouseY = e.getY();
				
			}
	}
